package com.mdlaser.api;

import lombok.Data;
import lombok.Getter;
import lombok.Setter;

@Data
@Setter
@Getter
public class ResponseResult<T> {

    private int status;

    private String msg;

    private T data;

    protected ResponseResult() {
    }

    protected ResponseResult(int status, String msg, T data) {
        this.status = status;
        this.msg = msg;
        this.data = data;
    }

    /**
     * 成功返回结果
     *
     * @param data 要返回的数据
     * @param <T>  泛型
     * @return 响应数据
     */
    public static <T> ResponseResult<T> success(T data) {
        return new ResponseResult<>(ResponseCode.SUCCESS.getCode(), ResponseCode.SUCCESS.getMessage(), data);
    }


    /**
     * 成功返回结果，自定义返回状态描述
     *
     * @param data 要返回的数据
     * @param <T>  泛型
     * @return 响应数据
     */
    public static <T> ResponseResult<T> success(String message, T data) {
        return new ResponseResult<>(ResponseCode.SUCCESS.getCode(), message, data);
    }

    /**
     * 成功返回结果，自定义返回字段信息
     *
     * @param code    自定义或者调用ResponseCode
     * @param message 自定义或者调用ResponseCode
     * @param data    返回的数据
     * @param <T>     泛型
     * @return 响应数据
     */
    public static <T> ResponseResult<T> success(int code, String message, T data) {
        return new ResponseResult<>(code, message, data);
    }


    public static <T> ResponseResult<T> failed(T data) {
        return new ResponseResult<>(ResponseCode.FAILED.getCode(), ResponseCode.FAILED.getMessage(), data);
    }

    /**
     * 失败返回结果
     *
     * @param message 要返回的失败信息
     * @param <T>     泛型
     * @return 响应数据
     */
    public static <T> ResponseResult<T> failed(String message) {
        return new ResponseResult<>(ResponseCode.FAILED.getCode(), message, null);
    }

    /**
     * 失败返回结果，自定义返回状态描述
     *
     * @param data 要返回的数据
     * @param <T>  泛型
     * @return 响应数据
     */
    public static <T> ResponseResult<T> failed(String message, T data) {
        return new ResponseResult<>(ResponseCode.FAILED.getCode(), message, data);
    }

    /**
     * 失败返回结果，自定义返回字段信息
     *
     * @param code    自定义或者调用ResponseCode
     * @param message 自定义或者调用ResponseCode
     * @param data    返回的数据
     * @param <T>     泛型
     * @return 响应数据
     */
    public static <T> ResponseResult<T> failed(int code, String message, T data) {
        return new ResponseResult<>(code, message, data);
    }
}
